package com.poc.importacao.baseabstract;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.poc.importacao.rios.EstadoContemRioManager;
import com.poc.log.Log;

public abstract class AbstractEntidadesAgrupadasPorRio extends AbstractManager {

	public static final String SELECT_AGRUPADO = "select distinct g.codlugar from lugar g, lugar g2, relacionamento_geo r , relacionamento_geo r2 where g.codlugar = r.codlugar2 and g.codtipolugar = %s and r.codlugar1 = g2.codlugar and g2.codtipolugar = 10 and r.codlugar1 = r2.codlugar1 and r2.codlugar2 = %s and g.codlugar <> %s";
	
	protected abstract Integer getTipoEntidade();

	protected abstract Double getEntidadeCount();
	
	protected abstract Integer getTipoRelacionamento();
	
	protected ResultSet getEntidadePrincipal() throws SQLException {
		return EstadoContemRioManager.getDatabaseManager().execute(String.format(AbstractAreaContemRioManager.SELECT_ENTIDADE, this.getTipoEntidade()));
	}
	
	protected ResultSet getRelacionados(String codLugarEntidade) throws SQLException {
		String query = String.format(AbstractEntidadesAgrupadasPorRio.SELECT_AGRUPADO, this.getTipoEntidade(), codLugarEntidade, codLugarEntidade);
		return AbstractEntidadesAgrupadasPorRio.getDatabaseManager().execute(query);
	}
	
	@Override
	public void createInserts(String fileName) throws SQLException, IOException {
		ResultSet codLugarEntidades = this.getEntidadePrincipal();
		ResultSet riosRelacionados = null;
		
		String codLugarEntidade;
	
		Double count = 0.0;
		Log inserts = new Log(fileName);
		inserts.append("INSERT INTO RELACIONAMENTO_GEO (codlugar1, codlugar2, codtiporelgeo, datacriacao) VALUES \n");
		while(codLugarEntidades.next()){
			codLugarEntidade = codLugarEntidades.getString(1);
		
			riosRelacionados = this.getRelacionados(codLugarEntidade);
			while(riosRelacionados.next()) {
				inserts.append((String.format(AbstractManager.INSERT_RELACIONAMENTO_PARAMS, riosRelacionados.getString(1), codLugarEntidade, this.getTipoRelacionamento())));					
			}
					
			//System.out.print((count/this.getEntidadeCount() * 100.) + "%\r");
			count++;
		}
		//System.out.print("Done!\r");
		inserts.close();
		this.finalize();

	}

}
